﻿using IdentityCenter.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Quartz;

namespace IdentityCenter
{
    public static class RegisterServiceExtensions
    {
        public static WebApplicationBuilder RegisterServices(this WebApplicationBuilder builder)
        {
            var services = builder.Services;
            services.AddControllersWithViews();

            services.AddDbContext<ApplicationDbContext>(options =>
            {
                options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
                options.UseOpenIddict();
            }).AddQuartz(options =>
            {

            });

            services
                .AddOpenIddict()
                // 注册OpenIddict核心组件。
                .AddCore(options =>
                {
                    // 配置OpenIddict以使用实体框架核心存储和模型。
                    // 注意：调用ReplaceDefaultEntities()来替换默认实体。
                    options.UseEntityFrameworkCore()
                           .UseDbContext<ApplicationDbContext>();
                })

                // 注册OpenIddict服务器组件。
                .AddServer(options =>
                {
                    // 启用令牌终结点。
                    options.SetTokenEndpointUris("connect/token");

                    // 启用客户端凭据流。
                    options.AllowClientCredentialsFlow();
                    // 启用授权码流
                    options.AllowAuthorizationCodeFlow();
                    // 允许token刷新
                    options.AllowRefreshTokenFlow();

                    // 注册签名和加密凭据。
                    options.AddDevelopmentEncryptionCertificate()
                           .AddDevelopmentSigningCertificate();

                    // 注册ASP.NET Core主机并配置ASP.NET Core选项。
                    options.UseAspNetCore()
                           .EnableTokenEndpointPassthrough();
                })

                // 注册OpenIddict验证组件。
                .AddValidation(options =>
                {
                    // 从本地OpenIddict服务器实例导入配置。
                    options.UseLocalServer();

                    // 注册ASP.NET Core主机。
                    options.UseAspNetCore();
                });

            services.AddCors();
            services.AddAuthorization();
            return builder;
        }
    }
}
